﻿/*
Copyright (C) 2008 raohmaru <http://www.raohmaru.com>

This file is part of Raohmaru AS3 Framework.

Raohmaru AS3 Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Raohmaru AS3 Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Raohmaru AS3 Framework.  If not, see <http://www.gnu.org/licenses/>.
*/

package jp.raohmaru.events 
{

/**
 * Utilidad para crear referencias de funciones añadiendo parámetros adicionales (úsese con <code>addEventListener</code>)
 * 
 * @author (c) 2007 Ian Thomas. Freely usable in whatever way you like, as long as it's attributed
 * @author (c) 2008 raohmaru. Traducción y adición del método <code>simple</code>
 * @version 1.0
 */
public class Callback
{
	/**
	* Crea una referencia a una función para una acción de <i>callback</i>.<br>
	* Añade parámetros adicionales definidos por el usuario a los parámetros que la función devuelve normalmente.
	* @param handler Función de referencia
	* @param args Parámetros adicionales
	* @example
	<listing version="3.0">
	bot1.addEventListener(MouseEvent.MOUSE_UP, Callback.create(link, "http://www.raohmaru.com"));<br>
	function link(e : MouseEvent, url : String)
	{
		// ...
	}</listing>
	*/
	public static function create(handler:Function, ...args):Function
	{
		return function() : *
		{
			return handler.apply( this, arguments.concat(args) );
		};
	}
	
	/**
	* Crea una referencia a una función para una acción de <i>callback</i>.<br>
	* Sustituye los parámetros que la función devuelve normalmente por parámetros adicionales definidos por el usuario.
	* @param handler Función de referencia
	* @param args Parámetros adicionales
	* @example
	<listing version="3.0">
	bot2.addEventListener(MouseEvent.MOUSE_UP, Callback.simple(update, 2, true));<br>
	function update(id : int, connect : Boolean)
	{
		// ...
	}</listing>
	* @author raohmaru
	*/
	public static function simple(handler:Function, ...args):Function
	{
		return function() : *
		{
			return handler.apply( this, args );
		};
	}
}
}